根據 Day 33 - 實作 S3 驅動 Lambda 函數進行鏡像,這是一個微服務的架構,只需將 AWS Lambda 函數改變成 YOLO 物件辨識的模型,就可以達成 YOLO 物件辨識的功能。
圖 1、S3 驅動 Lambda 函數進行 YOLO 辨識架構圖
在 github 找到一個這樣的專案 YOLO-on-Lambda,使用上非常簡單,只要上傳事先壓縮好的 darknetmin.zip 到 Lambda 函數中就可以運行,這個專案事實上是將事先在LInux環境編譯好的 YOLOv3 執行檔 darknet,以及一些相關的參數檔壓縮在 darknetmin.zip 中,流程如下所示,我們實際操作一遍。
步驟一、下載程式碼
到 YOLO-on-Lambda 網站中下載 darknetmin.zip,如下圖所示。
圖 2、下載 darknetmin.zip
步驟二、上傳 YOLO 相關檔案到 S3
因為 AWS Lambda 函數的大小限制為 256 MB,所以需要把 YOLO 的權重檔存到 S3 中,在 Day 16 - 進行影像辨識訓練已經根據自己給定的數據集,完成的權重的訓練,所以可以將這個檔案上傳到 S3,以及先前下載的 Lambda 程式碼和圖片,如下圖所示。
圖 3、上傳 YOLO 相關檔案到 S3
步驟三、建立 IAM 角色
建立一個 IAM 角色,允許執行 AWS Lambda,並有存取 S3 的許可。進入 IAM 管理控制台,選擇新增角色,接下來如下圖所示,選擇 Lambda 的使用案例後點擊 下一個:許可 按鈕。
圖 4、建立一個角色選擇 Lambda 的使用案例
在搜尋文字框中輸入 basic 找到 AWSLambdaBasicExecutionRole 進行連接,這將允許這個角色有寫入 CloudWatch 記錄檔的全縣,方便程式除錯之用,如下圖所示。
圖 5、連接基礎的 CloudWatch 除錯用的許可政策
最後確定先前的設定後並輸入角色名稱後,就可以建立角色,如下圖所示。
圖 6、檢閱設定並建立角色
編輯一個新的政策,內容如下圖所示,給定讀取 (GetObject) 儲存貯體 A 與寫入物件 (PutObject) 與權限 (PutObjectAcl) 到儲存貯體 B。
圖 7、新增政策
接著到角色設定畫面,將新建政策連接到角色上,如下圖所示。
圖 8、將新增的政策連接到先前的角色
步驟四、建立 AWS Lambda 函數
進入 AWS Lambda 管理控制台,選擇建立 Lambda 函數,設定內容如下圖所示。比較需要注意的是執行時間務必選擇Python 3.8,這是那個 github 專案的要求;而執行角色要也要記得選擇上一個步驟設定的角色。
圖 9、建立 Lambda 函數設定畫面
建立 Lambda 函數可以自行撰寫,也可以上傳壓縮檔,在第二個步驟中,我們已經把 Lambda 函數代碼上傳到 S3 ,只需在函數設定主畫面的右邊,可以找到一個 上傳於 按鈕,點擊後選擇 Amazon S3 位置,就可以指定位置,如 https://[BUCKETNAME].s3.ap-southeast-1.amazonaws.com/darknetmin.zip,畫面如下所示。
圖 10、建立 Lambda 函數設定畫面
步驟五、修改、佈署程式並進行測試
需要修改的地方有:
自建資料集相關檔案
相關的三個檔案都是純文件檔,所以只需在 AWS Lambda 操作畫面中進行新增檔案的操作就可以,檔案內容請參照 Day 15 - 說明 YOLO 相關設定,完成後畫面如下。
圖 11、在 Lambda 函數中新增自建資料集相關檔案
Lambda 函數執行環境
在 程式碼 頁簽中,下方有一個 執行時間設定 的選項需要進行設定,從上圖中可以知道整個 Lambda 函數的主要函數進入點是 service.py,所以需要在 執行時間設定 中,設定處理常式為 service.handler,完成後畫面如下。
圖 12、在執行時間設定中,設定處理常式
接著在 組態 頁簽中,選擇 一般組態,將 記憶體 (MB) 設定為 2048 ~ 5120 M,逾時 設定為 2 分鐘,完成後畫面如下。
圖 13、在組態頁簽中,設定一般組態
Lambda 函數本身
需要修改的是要指定權重檔與待測試圖片的所在位置,並將原本的執行命令改成./darknet detector test cfg/obj.data cfg/yolov3.cfg {} {}
,這樣才不會使用到預設的 coco.data 的標籤。
圖 14、修改 service.py 的內容
修改完畢後,進行佈署(Deploy)後,可以設定一個測試(test)計畫,不需要內容,直接測試即可。確認後會需要約 60 幾秒才會完成影像的辨識,如下圖所示。
圖 15、執行 YOLO Lambda 辨識功能
因為輸出是一整行,所以把這個輸出複製到一般編輯器中,比較方便看到辨識結果,如下圖所示。
圖 16、YOLO 辨識結果
而這樣的反應速度,如果是批次處理還可以,但是即時處理的話,反應速度太慢,可能需要再找其他工具來滿足這個需求。
換用 EFS 會再快一點
你說的是Amazon Elastic File System (Amazon EFS),如果是的話,如何可以加快?